package commons.errors;

import commons.logs.Logger;
import java.util.ArrayList;
import javax.swing.JOptionPane;


public class ErrorsHandler {

	static private int stackTraceDepth = 10;

	static private ArrayList<String> vErrors;
	static private ArrayList<Boolean> vIsInfo;

	static private String stackTraceFstError;

	
	static public boolean assertsEnabled = false;
	
	static {
		reinitErrors();
    
		// méthode grouik pour savoir si les assertions sont actives
        assert (assertsEnabled = true);
	}
	

	static public void reinitErrors() {
		vErrors = new ArrayList<String>();
		vIsInfo = new ArrayList<Boolean>();
		stackTraceFstError = "";
	}

	static public void addError (String msgError) {
		addError(msgError, false);

	}
	static public void addError (String msgError, boolean bIsInfo) {
		vErrors.add (msgError);
		vIsInfo.add (bIsInfo); // si c'est juste une info, on n'ajoutera pas de "car :" dans le bilan

		if (vErrors.size()==1) {
			//c'est la premiere erreur, on stocke le stacktrace
			StackTraceElement[] t = new Exception().getStackTrace();
			
			for(int i=0 ; i<Math.min(t.length, stackTraceDepth) ; i++) {
				// on n'ajoute pas les info concernant addError() ...
				if (t[i].toString().indexOf("addError")==-1)
					stackTraceFstError = stackTraceFstError + t[i] + "\n";
			}
		}
	}

	static public boolean isThereErrors() {
		return vErrors.size()>0;
	}

	static public String getErrorMsg() {
		String msg = "";

		int nbMsg = vErrors.size();
		for (int i=nbMsg-1; i>=0 ; i--) {
			if (i<nbMsg-1) {
				// >= 2ème ligne
				if (vIsInfo.get(i))
					msg += "\n[info] :\n";
				else
					msg += "\n\n car : ";
			}
			msg += vErrors.get(i);
		}

		if (Logger.getOutLevel()==Logger.Level.DEBUG1)
			msg += " \n\nSource de l'erreur :\n"
					  + "--------------------\n"
					+ stackTraceFstError;
		return msg;
	}

	public static void showErrors() {
		JOptionPane.showMessageDialog(null, ErrorsHandler.getErrorMsg(), "Erreur", JOptionPane.ERROR_MESSAGE);
	}

	public static void printErrors() {
		Logger.log_ERROR(getErrorMsg());
	}


}
